package cn.itcast.web.controller.system;

import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.utils.Encrypt;
import cn.itcast.utils.MailUtil;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.rabbit.MailProducer;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private DeptService deptService;

    @Autowired
    private MailProducer mailProducer;

    /**
     * 分页查询：
     *  请求连接：/system/user/list.do
     *  参数：
     *      page，size
     *  业务：
     *     调用service分页获取Pageinfo
     */
    @RequestMapping(value = "/list",name = "分页查询用户")
    public String list(@RequestParam(defaultValue = "1") int page,
                        @RequestParam(defaultValue = "5") int size) {
        System.out.println(1234);
        // 调用service分页获取Pageinfo
        PageInfo info = userService.findAll(page, size, getLoginCompanyId());
        request.setAttribute("page", info);
        return "system/user/user-list";
    }

    //进入到新增的页面
    @RequestMapping(value = "/toAdd",name ="进入到新增的页面" )
    public String toAdd() {
        //查询所有的部门
        List deptList = deptService.findAll(getLoginCompanyId());
        request.setAttribute("deptList",deptList);

        return "system/user/user-add";
    }


    /**
     * 新增或者修改用户
     *  请求拦截：edit
     *  参数：User对象
     *  业务：
     *    1、设置企业参数
     *    2、判断用户是否具有id属性
     *    3、没有id,调用service保存
     *    4、有id,调用service修改
     *    5、重定向到列表  list
     */
    @RequestMapping(value = "/edit",name = "新增或者修改用户")
    public String edit(User user) {
        //1、设置企业参数
        user.setCompanyId(getLoginCompanyId());
        user.setCompanyName(getLoginCompanyName());
        //2、判断用户是否具有id属性
        if(StringUtils.isEmpty(user.getId())) {
            //对密码加密
            String password = user.getPassword();
            user.setPassword(Encrypt.md5(password,user.getEmail()));
            //3、没有id,调用service保存
            userService.save(user);

            //保存成功，发送邮件
            String to = user.getEmail();
            String subject = "欢迎使用saas-export系统";
            String content = "尊敬的用户您好，欢迎使用saas-export系统，您的访问用户名："+to+",访问密码："+password;

            Map<String,String> map = new HashMap<>();
            map.put("to", to);
            map.put("subject", subject);
            map.put("content", content);

            mailProducer.send("user.insert",map);  //转化为json，转化为byte数组。发送到rabbit中
//            try {
//                MailUtil.sendMsg(to,subject,content);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
        }else {
            //4、有id,调用service修改
            userService.update(user);
        }
        return "redirect:/system/user/list.do";
    }

    /**
     * 进入到更新页面（根据id查询）
     *   请求连接：/system/user/toUpdate.do?id=7a56947d-2c46-4d51-99ba-a3f205e65fa2
     *   参数：id
     *   业务：
     *       根据id查询用户
     *       查询所有部门
     *       页面跳转
     */
    @RequestMapping(value = "/toUpdate",name ="进入到更新页面" )
    public String toUpdate(String id) {
        //根据id查询用户
        User user = userService.findById(id);
        request.setAttribute("user", user);
        //查询所有的部门
        List deptList = deptService.findAll(getLoginCompanyId());
        request.setAttribute("deptList",deptList);
        return "system/user/user-update";
    }

    //根据id删除
    @RequestMapping(value = "/delete",name = "根据id删除")
    public String delete(String id) {
        userService.delete(id);
        return "redirect:/system/user/list.do";
    }


    /**
     * 进入分配角色的页面
     *   请求连接：/system/user/roleList.do?id=002108e2-9a10-4510-9683-8d8fd1d374ef
     *   参数： id（用户id）
     *   业务逻辑：
     *      1、根据用户id查询用户
     *      2、查询所有的角色
     *      3、根据用户id查询用户具有的所有角色id   List<String>
     *      4、转化为字符串（通过“，”隔开）
     */
    @RequestMapping("/roleList")
    public String roleList(String id) {
        //1、根据用户id查询用户
        User user = userService.findById(id);
        request.setAttribute("user", user);
        //2、查询所有的角色
        List  roleList = roleService.findAll(getLoginCompanyId());
        request.setAttribute("roleList", roleList);
        //3、根据用户id查询用户具有的所有角色id
        List<String> ids = userService.findRoleIdsByUserId(id);
        //4、转化为字符串
        String userRoleStr = "";
        for (String s : ids) {
            userRoleStr += s +",";
        }
        request.setAttribute("userRoleStr",userRoleStr);
        return "system/user/user-role";
    }


    /**
     * 对用户分配角色
     *  请求连接：changeRole
     *  参数：
     *     String userid；
     *     String []  roleIds
     *  业务：
     *     调用service
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userid,String [] roleIds) {
        //1、调用service
        userService.changeRole(userid,roleIds);
        //2、重定向
        return "redirect:/system/user/roleList.do?id="+userid;
    }

    @ResponseBody
    @RequestMapping("/findPW")
    public String findPW(String password) {
        User user = getLoginUser();

        System.out.println("页面密码:" + password);
        password = Encrypt.md5(password, user.getEmail());
        String s = userService.findPW(user.getId(), password);

        return s;
    }

    @RequestMapping("/updatePW")
    public String updatePW(String newpassword) {
        User user = getLoginUser();
        String password = Encrypt.md5(newpassword, user.getEmail());
        user.setPassword(password);
        userService.update(user);
        //修改密码后跳转到登录首页1表示修改成功.
        return "forward:/login.jsp";
    }

    @RequestMapping("/changePW")
    public String changePW(){
        return "system/user/user-changepw";
    }
}
